package javaCode.chapter14.customgeneric;

/**
 * @author 徐州城
 * @version 1.0
 */
public class CustomInterfaceGeneric {
    public static void main(String[] args) {

    }
}

/**
 * 泛型接口使用的说明
 * 1. 接口中，静态成员不能使用泛型
 * 2. 泛型接口的类型，在继承接口或者实现接口时确定
 * 3. 没有指定类型，默认为Object
 */
interface IUsb<U, R> {

    int n = 10;

    //U name = "java"; 不能这样使用

    //普通方法中，可以使用接口泛型
    R get(U u);

    void hi(R r);

    //在jdk8中，可以在接口中，使用默认方法，也可以使用泛型
    default R method(U u) {
        return null;
    }
}

//在继承接口 指定泛型接口的类型
interface IA extends IUsb<Double, String>{

}

//当我们去实现IA接口，因为IA在继承IUsb 接口时，指定了 U为Double R为String
//，在实现IUsb接口的方法时，使用String替换R，使用Double U
class AA implements IA{
    @Override
    public String get(Double aDouble) {
        return null;
    }

    @Override
    public void hi(String s) {}
}

//实现接口时，直接指定泛型接口的类型
//给U 指定Integer 给R 指定Float
//所以，当我们实现IUsb方法时，会使用Integer替换U，使用Float替换R
class BB implements IUsb<Integer, Float>{
    @Override
    public Float get(Integer integer) {
        return null;
    }

    @Override
    public void hi(Float aFloat) {}
}

//没有指定接口泛型，默认为Object
//建议这样写: IUsb<Object, Object>
class CC implements IUsb{//等价于IUsb<Object, Object>
    @Override
    public Object get(Object o) {
        return null;
    }

    @Override
    public void hi(Object o) {}
}